#include <iostream>
#include <vector>
#include <functional>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

void Handler(int signo)
{
    std::cout << "我获得了一个信号 : " << signo << std::endl;
}

int main()
{

    for (int signo = 1; signo < 32; signo++)
    {
        signal(signo, Handler); // 默认终止 -> 执行自定义方法：Handler
        std::cout << "自定义捕捉信号: " << signo << std::endl;
    }

    while (true)
    {
        std::cout <<  "My pid : "<<getpid()<<"hello world" << std::endl;
        sleep(1);
    }

    return 0;
}

// int main()
// {
//     if (fork() == 0)
//     {
//         sleep(1);
//         int a = 10;
//         a /= 0;
//         exit(0);
//     }

//     int status = 0;
//     waitpid(-1, &status, 0);
//     printf("exit signal: %d, core dump: %d\n", status & 0x7F, (status >> 7) & 1);
//     return 0;
// }

// void handler(int sig)
// {
//     printf("catch a sig : %d\n", sig);
// }
// // v1
// int main()
// {
//     signal(SIGSEGV, handler); // 11) SIGFPE
//     sleep(1);
//     int* p = nullptr;
//     *p = 10;
//     // int a = 10;
//     // a /= 0;
//     while (1);
//     return 0;
// }

// using func_t = std::function<void()>;

// int gcount = 0;
// std::vector<func_t> gfuncs;

// //把信号更换为硬件中断
// void Handler(int signo)
// {
//     for(auto& f : gfuncs)
//     {
//         f();
//     }
//     std::cout << "gcount : "<<gcount << std::endl;
//     int n = alarm(1);//重新设置闹钟，返回上一次剩余时间
//     std::cout << "剩余时间 : "<<n << std::endl;
// }

// int main()
// {
//     gfuncs.push_back([](){std::cout << "我是内核刷新操作"<<std::endl;});
//     gfuncs.push_back([](){std::cout << "我是切换时间片操作，到了时间，会切换进程"<<std::endl;});
//     gfuncs.push_back([](){std::cout << "我是内核管理操作，定期清理内存碎片"<<std::endl;});

//     alarm(1);
//     signal(SIGALRM,Handler);

//     while(true)
//     {
//         pause();
//         std::cout << "我醒来了……"<<std::endl;
//         gcount++;
//     }

//     return 0;
// }

// void die(int signo)
// {
//     std::cout <<"get a siganl : "<< signo << std::endl;
// }
// int main()
// {
//     alarm(10);

//     sleep(4);
//     int n = alarm(0);//取消闹钟
//     std::cout << "n : "<<n << std::endl;

//     signal(SIGALRM,die);

//     return 0;
// }

// // IO 少
// int count = 0;
// void handler(int signumber)
// {
//     std::cout << "count : " << count << std::endl;
//     exit(0);
// }
// int main()
// {
//     signal(SIGALRM, handler);
//     alarm(1);
//     while (true)
//     {
//         count++;
//     }
//     return 0;
// }

// // IO 多
// int main()
// {
//     int count = 0;
//     alarm(1);
//     while (true)
//     {
//         std::cout << "count : "
//                   << count << std::endl;
//         count++;
//     }
//     return 0;
// }

// void Handler(int signo)
// {
//     std::cout << "我是进程 : "<<getpid()<<",我获得了一个信号 : "<<signo<<std::endl;
// }

// int main()
// {
//    signal(6,Handler);// 先对2号信号进⾏捕捉

//    // 每隔1S，⾃⼰给⾃⼰发送2号信号
//    while(true)
//    {
//         sleep(1);
//         //raise(2);
//         abort();
//    }

//     return 0;
// }

// // ./signal -9 pid
// int main(int argc, char* argv[])
// {
//     if(argc != 3)
//     {
//         std::cout << "输入错误，请重新输入 "<<std::endl;
//         return 1;
//     }

//     int killnum = std::stoi(argv[1]+1);//去掉-
//     int pid  = std::stoi(argv[2]);

//     int n = ::kill(pid,killnum);
//     if(n  <0)
//     {
//         std::cout << "kill 失败"<<std::endl;
//         return 2;
//     }

//     return 0;
// }

// int main()
// {
//     while(true)
//     {
//         sleep(1);
//     }

//     return 0;
// }

// void Handler(int signo)
// {
//     std::cout << "我是进程 : "<<getpid()<<",我获得了一个信号 : "<<signo<<std::endl;
// }

// int main()
// {
//     std::cout << "我是进程："<<getpid()<<std::endl;

//     signal(SIGTSTP,Handler);//设置忽略信号的宏

//     while(true)
//     {
//         //std::cout << "I am a process, I am waiting siganl " << std::endl;
//         std::cout << "hello world "<<std::endl;
//         sleep(1);
//     }
//     return 0;
// }

// int main()
// {
//     while(true)
//     {
//         std::cout << "I am a process, I am waiting signal"<<std::endl;
//         sleep(1);
//     }

//     return 0;
// }